# 生成数据,数据样式：
# x：[[ 0.05175328 -0.91952579  1.23943184]      y类别:[2 0]
#     [-0.06851406 -1.09510487  1.42925019]]
# LDA既可以用来降维（将W视为投影矩阵），又可以用来分类，但主要还是用于降维。
# (0)在降维过程中可以使用类别的先验知识经验，而PCA（无监督学习）无法使用类别先验知识
# (1)LDA为有监督降维，PCA为无监督降维。
# (2)PCA可以降低到任意维度，LDA只能降维最大至类别数减1。
# (3)LDA可以进行分类
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from numpy import array
from sklearn.datasets import make_classification

x, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,
                           n_clusters_per_class=1, class_sep=0.5, random_state=10)
print(x.shape)
fig = plt.figure()
ax = Axes3D(fig)
fig.add_axes(ax)
ax.scatter(x[:, 0], x[:, 1], x[:, 2], c=y)
plt.show()

# LDA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

model2 = LinearDiscriminantAnalysis(n_components=2)  # 将维至n-1维（特征数减一）
model2.fit(x, y)
x2 = model2.transform(x)
print(x2.shape)
print(x2[:, 0])
print(x2[:, 1])
plt.scatter(x2[:, 0], x2[:, 1], c=y)  # c：颜色控制
plt.show()

# 预测
xa = array([[0.05175328, -0.91952579, 1.23943184]])
xa1 = model2.transform(xa)
print(xa1)
